/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.database.bean;

import com.database.dao.AreaDao;
import com.database.dao.CargoDao;
import com.database.dao.CategoriaDao;
import com.database.dao.PerfilDao;
import com.database.dao.UsuarioDao;
import com.database.dao.impl.AreaDaoImplement;
import com.database.dao.impl.CargoDaoImplement;
import com.database.dao.impl.CategoriaDaoImplement;
import com.database.dao.impl.PerfilDaoImplement;
import com.database.dao.impl.UsuarioDaoImplement;
import com.database.model.Categoria;
import com.database.model.Usuario;
import com.database.util.HibernateUtil;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Calendar;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import org.hibernate.Session;
import org.primefaces.event.FileUploadEvent;
import org.primefaces.model.UploadedFile;

/**
 *
 * @author diego y Yinna
 */
@ManagedBean(name = "usuarioBean")
@SessionScoped
public class usuarioBean {

    private Usuario usuario;//Atributo de tipo Usuario para la realizacion de transacciones
    private List<Usuario> usuarios;
    private List<SelectItem> usuariosItems;//Lista de Usuarios para el selectOneMenu
    private int idPerfil;
    private int idArea;
    private int idCargo;
    private int idCategoria;
    private String destination = "C:\\Users\\diego\\Documents\\NetBeansProjects\\Imagen_Servidor\\trunk\\CRI\\web\\resources\\fotos\\";
    private String nombreFoto;
    private UploadedFile file;
    private File file_;
    private int categoria;
    private List<Usuario> usuariosTecnicos;

    /**
     * Creates a new instance of usuarioBean
     */
    public usuarioBean() {
        this.usuario = new Usuario();
    }

    /**
     * Retorna un BOjeto usuario
     *
     * @return tipo de dato Usuaio
     */
    public Usuario getUsuario() {
        return this.usuario;
    }

    /**
     * Modifica un objeto Usuario
     *
     * @param usuario
     */
    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }

    /**
     * Recupero todos los usuarios registrados en la base de datos en una Lista.
     *
     * @return
     */
    public List<Usuario> getUsuarios() {
        UsuarioDao usuarioDao = new UsuarioDaoImplement();
        usuarios = usuarioDao.buscarTodos();
        return usuarios;
    }

    /**
     * Este se encarga de limpiar el formulario de información de registro o de
     * edicion de Usuarios. populada
     */
    public void preparInsertar() {
        usuario = new Usuario();
    }

    /**
     * Busca a un usuario por su id para buscarlo y mostrar la información en el
     * formulario de editción.
     *
     * @param id
     */
    public void prepararActualizar(Integer id) {
        UsuarioDao usuarioDao = new UsuarioDaoImplement();
        usuario = usuarioDao.buscarPorId(id);
    }

    /**
     * Busca a un usuario por su id para buscarlo y eliminarlo (Desactivarlo) de
     * la base de datos.
     *
     * @param id
     */
    public void prepararEliminar(Integer id) {
        UsuarioDao usuarioDao = new UsuarioDaoImplement();
        usuario = usuarioDao.buscarPorId(id);
    }

    /**
     * Crea un una instancia de la clase UsuarioDaoImplement para llamar al
     * metodo de insertar un nuevo usuario quien maneja dicha transaccion para
     * ingresar nuevo usuario.
     */
    public void insertar() {
        prepararSelectOneMenu();
        if (nombreFoto != null) {//Si se carga la foto, dejela con el nombre que debe tener
            usuario.setFoto(usuario.getIdentificacion() + "_" + nombreFoto);
        } else if (nombreFoto == null) {
            usuario.setFoto("sinFoto.jpg");    //Si no se carga la foto, se le asigna este nombre por defecto
        }
        
        asignarFechaRegistro();
        UsuarioDao usuarioDao = new UsuarioDaoImplement();
        usuarioDao.insertar(usuario);
        actualizarCategoria();
        usuario = new Usuario();
    }

    /**
     * Crea un una instancia de la clase UsuarioDaoImplement para llamar al
     * metodo de editar un nuevo quien maneja dicha transaccion.
     */
    public void actualizar() {
        prepararSelectOneMenu();
        if (nombreFoto != null) {//Si se actualiza la foto, dejela con el nombre que debe tener
            usuario.setFoto(usuario.getIdentificacion() + "_" + nombreFoto);
        } else if (nombreFoto == null) {
            usuario.setFoto(usuario.getFoto());
            /*De lo contrario, no debe ser modificada.*/ 
            
        }
        UsuarioDao usuarioDao = new UsuarioDaoImplement();
        usuarioDao.actualizar(usuario);
        usuario = new Usuario();
    }

    public void eliminar() {
        UsuarioDao usuarioDao = new UsuarioDaoImplement();
        usuarioDao.eliminar(usuario);
        usuario = new Usuario();
    }

    public void prepararSelectOneMenu() {
        PerfilDao perfilDao = new PerfilDaoImplement();
        usuario.setPerfil(perfilDao.buscarPorId(idPerfil));
        AreaDao areaDao = new AreaDaoImplement();
        usuario.setArea(areaDao.buscarPorId(idArea));
        CargoDao cargoDao = new CargoDaoImplement();
        usuario.setCargo(cargoDao.buscarPorId(idCargo));
        cambiarNombreFoto();
        
    }

    /**
     * Retorna el id de un perfil
     *
     * @return Codigo de perfil
     */
    public int getIdPerfil() {
        return idPerfil;
    }

    public void setIdPerfil(int idPerfil) {
        this.idPerfil = idPerfil;
    }

    /**
     * Retorna el id de una Area
     *
     * @return Codigo de una Area
     */
    public int getIdArea() {
        return idArea;
    }

    /**
     * Modificar valro del codigo de un area
     *
     * @param idArea
     */
    public void setIdArea(int idArea) {
        this.idArea = idArea;
    }

    /**
     * Retorna el id de un Cargo
     *
     * @return Codigo de un cargo
     */
    public int getIdCargo() {
        return idCargo;
    }

    /**
     * Modificar valro del codigo de un Cargo
     *
     * @param idCargo
     */
    public void setIdCargo(int idCargo) {
        this.idCargo = idCargo;
    }

    /**
     * Retorna el id de una categoria
     *
     * @return Codigo de una categoria
     */
    public int getIdCategoria() {
        return idCategoria;
    }

    /**
     * Modificar valro del codigo de un Categoria
     *
     * @param idCategoria
     */
    public void setIdCategoria(int idCategoria) {
        this.idCategoria = idCategoria;
    }

    /**
     * Metodo necesario para el subir la foto del PC del usuario al Servidor.
     *
     * @param event
     */
    public void upload(FileUploadEvent event) {
        FacesMessage msg = new FacesMessage("Perfecto ! ", event.getFile().getFileName() + "El archivo ha sido cargado.");
        FacesContext.getCurrentInstance().addMessage(null, msg);
        // Do what you want with the file.
        try {
            nombreFoto = event.getFile().getFileName();
            copyFile(event.getFile().getFileName(), event.getFile().getInputstream());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * Metodo que recibe el archivo cargado para ser copiado al servidor.
     *
     * @param fileName
     * @param in
     */
    public void copyFile(String fileName, InputStream in) {
        try {
            // write the inputStream to a FileOutputStream
            OutputStream out = new FileOutputStream(new File(destination + fileName));
            int read = 0;
            byte[] bytes = new byte[1024];

            while ((read = in.read(bytes)) != -1) {
                out.write(bytes, 0, read);
            }
            in.close();
            out.flush();
            out.close();

            // System.out.println("New file created!");
        } catch (IOException e) {
           //  System.err.println(e.getMessage());
        }
    }

    /**
     * Metodo encargado para hacer el nombre de cada foto unico e irrepetible en
     * la carpeta contenedora de fotos y ser almacenada en la base de datos.
     */
    public void cambiarNombreFoto() {
        File f1 = new File(destination + nombreFoto);
        File f2 = new File(destination + usuario.getIdentificacion() + "_" + nombreFoto);
        f1.renameTo(f2);
    }

    public String getNombreFoto() {
        return nombreFoto;
    }

    public void setNombreFoto(String nombre) {
        this.nombreFoto = nombre;
    }

    public UploadedFile getFile() {
        return file;
    }

    public void setFile(UploadedFile file) {
        this.file = file;
    }

    public int getCategoria() {
        return categoria;
    }

    public void setCategoria(int categoria) {
        this.categoria = categoria;
    }

    public void actualizarCategoria() {

        CategoriaDao categoriaDao = new CategoriaDaoImplement();
        Categoria categoriaModificada = categoriaDao.buscarPorId(categoria);
        //categoriaModificada.setAtendidoPor(usuario.getCodUsuario());

        System.err.println("categoria a modificar: " + categoriaModificada.getNombre() + "\n"
                + "con el codigo:" + usuario.getCodUsuario());

        Session session = HibernateUtil.getSessionFactory().openSession();

        try {
            session.beginTransaction();
            session.merge(categoriaModificada);
            session.beginTransaction().commit();
        } catch (Exception e) {
            session.beginTransaction().rollback();
        }

    }
    
    public void asignarFechaRegistro(){
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.HOUR_OF_DAY, Calendar.HOUR);
        calendar.set(Calendar.MINUTE, calendar.getActualMaximum(Calendar.MINUTE));
        calendar.set(Calendar.SECOND, calendar.getActualMaximum(Calendar.SECOND));
        usuario.setFechaRegistro(calendar.getTime());
    }
    
    
    public List<Usuario> buscarTecnicos(){
        UsuarioDao usuarioDao = new UsuarioDaoImplement();
        usuariosTecnicos = usuarioDao.buscarTodosPorCategoria(null);
        return usuariosTecnicos;
    }
}